.github(特別強調前面的小數點不可漏掉)。workflows(特別強調字尾的 s)。monitor.yml)放置於此目錄下。
我們要告訴 GitHub 什麼時候該派出抓取情資。建議使用「雙軌制」觸發機制:
schedule):透過 Cron 語法來設定執行時間。由於 GitHub 伺服器使用的是 UTC 時間,要換算成台灣時間 (GMT+8) 需要減去 8 小時。設定為 0 23,0,4,5 * * *,代表系統會在台灣時間的每天 07:00、08:00、12:00 與 13:00 自動啟動。workflow_dispatch):這個設定允許我們在開發或除錯階段,隨時從 GitHub 後台手動點擊按鈕來觸發腳本執行。為了讓自動化機器人能將收集到的情資寫回我們的專案中,必須正確配置權限。這需要完成兩層設定:
permissions: contents: write,宣告機器人具備寫入內容的權限。在 Day2 我用了郵件預警功能,在執行 python main.py 階段,安全地將前置作業準備好的 MAIL_USERNAME、MAIL_PASSWORD 與 MAIL_TO 透過 GitHub Secrets 注入為環境變數,確保敏感的應用程式密碼不會直接暴露在程式碼中。
前置作業完成後,最後就是讓系統啟動並執行我們的 Python 程式:
ubuntu-latest),安裝 Python 3.10。接著會自動安裝 requests、beautifulsoup4、feedparser 與 playwright 等必備套件。python main.py。這支程式是整套監控系統的核心調度程式,負責串聯資料抓取、過濾、分析到發送警報的完整自動化生命週期。last_seen.json)、原始抓取紀錄 (raw_discovery.csv)、預警發送紀錄 (alert_history.log) 以及 Markdown 報表資料夾 (history_logs/*.md) 提交並推送回 GitHub。[skip ci] 標籤。這個小細節非常重要,它能防止這次的自動推送再次觸發 GitHub Actions,避免系統陷入無窮無盡的執行迴圈。ubuntu-latest 環境,指定 Python 3.10,並自動安裝爬蟲必備的 requests、beautifulsoup4、feedparser 與 playwright 套件。actions/cache@v4) 以及 Python pip 快取,這能大幅縮短每次 Action 啟動的等待時間並節省免費的運算資源。last_seen.json、原始資料、報表資料夾 history_logs/*.md 追蹤並寫回儲存庫。git diff --staged --quiet 判斷是否真的有新變更才進行 Commit,並且在 Commit 訊息中加入 [skip ci],這是一個重要的防護機制,能防止這次自動推送意外再次觸發 GitHub Actions 造成無限迴圈。最後附上我現在使用的YML 提供慘考
name: 情OOOOOOO統
on:
schedule:
#- cron: '0 0,5 * * *' # 每天 08:00 與 13:00 台北時間執行
# 這裡使用 UTC 時間,台灣時間 (GMT+8) 需減去 8 小時
# 07:00 -> 23:00 (前一天)
# 08:00 -> 00:00
# 12:00 -> 04:00
# 13:00 -> 05:00
- cron: '0 23,0,4,5 * * *'
workflow_dispatch: # 允許手動觸發
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
# 1. 設定 Python
- uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: Install Python dependencies
run: |
pip install requests beautifulsoup4 feedparser playwright
# 2. 實作 Playwright 瀏覽器快取 (加速執行)
- name: Cache Playwright browsers
uses: actions/cache@v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-playwright-
# 3. 安裝瀏覽器
- name: Install Browser and System Dependencies
run: |
playwright install chromium
playwright install-deps chromium
# 4. 執行監控程式 (這裡會看到 main.py 裡的各階段 print 輸出)
- name: Run Monitor
env:
MAIL_USERNAME: ${{ secrets.MAIL_USERNAME }}
MAIL_PASSWORD: ${{ secrets.MAIL_PASSWORD }}
MAIL_TO: ${{ secrets.MAIL_TO }}
HTTP_TIMEOUT: 20
run: python main.py
# 5. [除錯專用] 顯示本次執行結果摘要
- name: Display Execution Summary (Debug)
run: |
echo "==== [DEBUG] 原始抓取紀錄 (最後 5 筆) ===="
if [ -f "raw_discovery.csv" ]; then tail -n 5 raw_discovery.csv; else echo "raw_discovery.csv 不存在"; fi
echo -e "\n==== [DEBUG] 預警發送紀錄 (最後 5 筆) ===="
if [ -f "alert_history.log" ]; then tail -n 5 alert_history.log; else echo "無發送紀錄"; fi
echo -e "\n==== [DEBUG] 狀態檔案檢查 ===="
ls -lh last_seen.json
# 6. 提交變更並推送回 GitHub
- name: Commit and push changes
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
# 確保所有新的紀錄檔都被追蹤
git add last_seen.json
# 加入全量原始紀錄與預警紀錄
if [ -f "raw_discovery.csv" ]; then git add raw_discovery.csv; fi
if [ -f "alert_history.log" ]; then git add alert_history.log; fi
# 加入 Markdown 報表資料夾
if [ -d "history_logs" ]; then
git add history_logs/*.md || echo "No new reports found"
fi
# 檢查是否有變更需要 commit
if git diff --staged --quiet; then
echo "沒有任何變更需要提交"
else
git commit -m "Automated update: $(date +'%Y-%m-%d %H:%M:%S') [skip ci]"
git push
fi